package cn.net.ecode.modules.msg.task;

import java.util.Date;
import java.util.List;

import cn.net.ecode.common.persistence.Page;
import cn.net.ecode.common.service.BaseService;
import cn.net.ecode.modules.msg.entity.Message;
import cn.net.ecode.modules.msg.entity.MessageRecord;
import cn.net.ecode.modules.msg.service.MessageService;

/**
 * 自定义消息发送服务（调度任务）
 * @author ThinkGem
 * @version 2015-10-8
 */
public class MsgLocalSendTask extends BaseService {
	
	/**
	 * 消息记录服务
	 */
	private MessageService messageService;
	
	/**
	 * 短信发送服务
	 */
	private MsgSendService smsSendService;
	
	/**
	 * 邮件发送服务
	 */
	private MsgSendService mailSendService;
	
	/**
	 * 微信发送服务
	 */
	private MsgSendService weixinSendService;
	
	/**
	 * 执行消息发送任务
	 */
	public void execute(){
		logger.info("==== 消息发送服务（启动） ====================");
		
		MessageRecord mr = null;
		Boolean result = null;
		
		// 直到发送完成
		while(true){
			
			// 查询未发送的消息
			List<MessageRecord> list = findMessageList();
			
			// 如果没有已经发送的消息，则跳出循环
			if (list.size() == 0){
				break;
			}
			
			// 发送失败个数
			int failCount = 0;
			
			// 根据消息保存顺序发送消息
			for (int i=list.size()-1; i>=0; i--){
				mr = list.get(i);
				result = false;
				
				// 根据消息类型设置接受者
				switch (mr.getMessage().getType()) {
				case Message.TYPE_MESSAGE:	// 1通知
				case Message.TYPE_NOTIFY:	// 2消息
				case Message.TYPE_SMS:		// 3短信
					if (smsSendService != null){
						result = smsSendService.sendMessage(mr);
					}else{
						logger.warn("系统没有配置“短信”消息发送服务接口的实现。");
					}
					break;
				case Message.TYPE_EMAIL:	// 4邮件
					if (mailSendService != null){
						result = mailSendService.sendMessage(mr);
					}else{
						logger.warn("系统没有配置“邮件”消息发送服务接口的实现。");
					}
					break;
				case Message.TYPE_WEIXIN:	// 5微信
					if (weixinSendService != null){
						result = weixinSendService.sendMessage(mr);
					}else{
						logger.warn("系统没有配置“微信”消息发送服务接口的实现。");
					}
					break;
				}

				// 发送成功则，更新消息状态为已读
				if (result){
					updateMessageStatus(mr.getId(), MessageRecord.STATUS_READ);
				}else{
					failCount++;
				}
			}
			
			// 如果没有一条消息能够发送成功，则停止下一步发送
			if (list.size() == failCount){
				logger.warn("没有一条消息能够发送成功，请检查你的消息服务配置。");
				break;
			}
			// 提示失败的消息个数
			else if (failCount > 0){
				logger.warn("你有“" + failCount + "”条消息没有发送成功！");
			}
			
		}
		
//		try {
//			Thread.sleep(5000);
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
		logger.info("==== 消息发送服务（结束） ====================");
	}

	/**
	 * 获取待发送的消息列表（发送时间倒序）默认获取30条
	 * @return
	 */
	public List<MessageRecord> findMessageList(){
		Page<MessageRecord> page = new Page<>(1, 30, -1);
		MessageRecord mr = new MessageRecord();
		mr.setStatus(MessageRecord.STATUS_UNDELIVERED);
		mr.getMessage().setType("sendTask"); // 发送服务查询条件（不查询内部消息）
		mr.getMessage().setEndSendDate(new Date());
		page = messageService.findMessageRecordPage(page, mr);
		return page.getList();
	}
	
	/**
	 * 更新发送状态，为已读
	 * @return
	 */
	public void updateMessageStatus(String mrId, String status){
		MessageRecord mr = new MessageRecord(mrId);
		mr.setReceiveDate(new Date());
		mr.setReadDate(new Date());
		mr.setStatus(status);
		messageService.updateMsgRecord(mr);
	}

	////////////////// 以下set方法，通过spring的xml配置注入 ///////////////
	
	public void setMessageService(MessageService messageService) {
		this.messageService = messageService;
	}

	public void setSmsSendService(MsgSendService smsSendService) {
		this.smsSendService = smsSendService;
	}

	public void setMailSendService(MsgSendService mailSendService) {
		this.mailSendService = mailSendService;
	}

	public void setWeixinSendService(MsgSendService weixinSendService) {
		this.weixinSendService = weixinSendService;
	}
}
